// function removeWithoutCopy(arr, item) {
//   return arr.filter(function(ele){
//            return ele != item;
//       })
// }

// console.log(removeWithoutCopy([1, 2, 2, 3, 4, 2, 2],2));

// 数组扁平化
var arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
Array.from(new Set(arr.flat(Infinity))).sort((a, b) => { return a - b });


// 进行分析new的过程，主要有以下几点
// 1、创建一个新的对象
// 2、把obj的__proto__指向fn的prototype,实现继承
// 3、改变this的指向，执行构造函数、传递参数,fn.apply(obj,) 或者 fn.call()

function Dog (name) {
  this.name = name
  this.say = function () {
    console.log('name = ' + this.name)
  }
}
function Cat (name) {
  this.name = name
  this.say = function () {
    console.log('name = ' + this.name)
  }
}
function _new (fn, ...arg) {
  //1、
  // const obj = {}; //创建一个新的对象
  // obj.__proto__ = fn.prototype; //把obj的__proto__指向fn的prototype,实现继承
  // 等同于 const obj = Object.create(fn.prototype);
  // 2、
  console.log(arguments);
  var constr = Array.prototype.shift.call(arguments);
  var obj = Object.create(constr.prototype);


  fn.apply(obj, arg) //改变this的指向
  return Object.prototype.toString.call(obj) == '[object Object]' ? obj : {} //返回新的对象obj
}

//测试1
var dog = _new(Dog, 'aaa')
dog.say() //'name = aaa'
console.log(dog instanceof Dog) //true
console.log(dog instanceof Cat) //true
//测试2
var cat = _new(Cat, 'bbb');
cat.say() //'name = bbb'
console.log(cat instanceof Cat)